//
//  Bird.m
//  runtimeTest
//
//  Created by ian on 16/1/26.
//  Copyright © 2016年 ian. All rights reserved.
//

#import "Bird.h"
#import "People.h"

@implementation Bird

// 第一步：我们不动态添加方法，返回NO，进入第二步；
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    return NO;
}

// 第二部：我们不指定备选对象响应aSelector，进入第三步；
- (id)forwardingTargetForSelector:(SEL)aSelector
{
    return nil;
}

// 第三步：返回方法选择器，然后进入第四部；
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    if ([NSStringFromSelector(aSelector) isEqualToString:@"sing"]) {
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }
    
    return [super methodSignatureForSelector:aSelector];
}

// 第四部：这步我们修改调用对象
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    // 所以这步既可以改变消息接受对象，还可以改变实现
    // 第二步仅可以改变接收对象
    // 第一步仅可以新增对应的实现
    
    // 我们改变调用对象为People，people类有对应的sing方法
    People *cangTeacher = [[People alloc] init];
    cangTeacher.name = @"苍老师";
    [anInvocation invokeWithTarget:cangTeacher];
    // 不改变对象
//    [anInvocation setSelector:@selector(dance)];
//    [anInvocation invokeWithTarget:self];
}

// 若forwardInvocation没有实现，则会调用此方法
- (void)doesNotRecognizeSelector:(SEL)aSelector
{
    // 如果没有做任何动态解析处理，或者解析处理有问题，都会走到这边，引起崩溃
    NSLog(@"消息无法处理：%@", NSStringFromSelector(aSelector));
}

- (void)dance
{
    NSLog(@"跳舞！！！come on！");
}


@end
